package A.reflection;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //根据配置文件 re.properties 指定信息，创建Cat对象并调用hi方法

        /**
         * 方式1、传统方法
         */
//        Cat cat = new Cat();
//        cat.hi();

        /**
         * 方式2、流
         */
        //1、使用properties类（可以读写配置文件）
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\A\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath=" + classfullpath);
        System.out.println("method=" + methodName);
        //2、创建对象,实现不了。。。

        /**
         * 方式3、reflection
         */
        //1、加载类，返回class类型的对象
        Class<?> cls = Class.forName(classfullpath);
        //2、通过cls得到加载的类 A.reflection.Cat 的对象实例
        Object o = cls.newInstance();
        System.out.println("o的运行类型=" + o.getClass());
        //3、通过 cls 获取加载的类 A.reflection.Cat 的 methodName 的方法对象
        //      即：在反射中，可以把方法视为对象
        Method method1 = cls.getMethod(methodName);
        System.out.println("=================================");
        //4、通过method1 调用
        method1.invoke(o);//传统方法：对象.方法；反射机制：方法.invoke(对象)

    }
}
